/**
 * 
 * 筛选：数字对比筛选；字符串筛选；
 * @type { object/array }
 * @param { object/array } data     元数据
 * @param { string } s              筛选元素
 * @param { string/number} s1       对比值   number为数值对不，string为字符串对比
 **/

const filterFun = (data, s, s1) => {
    let result;
    if (typeof s1 === "number") {
        result = data.filter(element => element[s] > s1);
    }else if (typeof s1 === "string") {
        result = data.filter(element => element[s] === s1);
    }else{
        throw new Error(`Unsupported type for comparison: ${typeof s1}`)
    }
    return result;
}

/**
 * 
 * 时间格式化
 * @type { string }
 * @param { date/string/number } date   时间参数，可是字符串也可是时间戳
 * @param { string } ic                 日期的链接符
 * @param { string/"" } d/t             d返回日期， t返回时间， 不传值为日期+时间
 */
const formatDate = (date, ic, d = "") => {
    let timestamp, newDate
    if (typeof date != "number") {
        timestamp = Date.parse(date);
        newDate = new Date(timestamp);
    } else {
        newDate = new Date(date)
    }
    const year = newDate.getFullYear();
    const month = newDate.getMonth() + 1 > 9 ? newDate.getMonth() + 1 : "0" + (newDate.getMonth() + 1);
    const day = newDate.getDate() > 9 ? newDate.getDate() : "0" + newDate.getDate();
    const hour = newDate.getHours() > 9 ? newDate.getHours() : "0" + newDate.getHours();
    const minute = newDate.getMinutes() > 9 ? newDate.getMinutes() : "0" + newDate.getMinutes();
    const second = newDate.getSeconds() > 9 ? newDate.getSeconds() : "0" + newDate.getSeconds();
    if (d === "d")
        return [year, month, day].join(ic);
    if (d === "t")
        return [hour, minute, second].join(':');
    else
        return [year, month, day].join(ic) + ' ' + [hour, minute, second].join(':');
}

/**
 *  判空：对字符串、数组、null、undefined、对象、nan进行判空处理
 *  @type { Boolean } 
 *  @param { any } v any    判空的参数
 * 
 * 
 *  */
const isEmpty = (v) => {
    return v === null ||
        v === undefined ||
        v == "undefined" ||
        v == "null" ||
        ('' + v) === 'NaN' ||
        JSON.stringify(v) === '[]' ||
        JSON.stringify(v) === '{}' ||
        v === ''
}

/**
 *  时间格式化：兼容iOS老款手机 
 *  @param { string/number/date } val   判空的参数（时间）
 *  * 字符串格式：
 *    中国标准时间：Mon Apr 25 2022 17:37:39 GMT+0800 (中国标准时间)
 *    普通格式时间：2020-10-20或者是2020/10/20
 * 数值格式：
 *    时间戳：28389228320938
 * 
 *  */

const iosFormatDate = (val = "") => {
    let oldDate = "", year = "", month = "", day = "", hours = "", minute = "", second = "", D = ""
    if (isEmpty(val)) {
        D = new Date()
    } else if (typeof (val) == "string") {
        // ios系统手机不兼容'-'分割的时间格式，要将'-'转为'/',否则报错
        D = val.replace(/\-/g, '/')
        let d = ""
        if (val.endsWith(".0")) {
            d = new Date(D.replace(/\.0/g, ''))
        } else {
            d = new Date(D)
        }
        //传入的是字符串（例："2020-12-03"）根据要求显示时间格式
    } else {
        D = new Date(val)
        oldDate = D
        // 返回时间戳再次操作，类型数值number（例：928323403820930）
    }
    year = D.getFullYear(),
        month = (D.getMonth() + 1 + '').padStart(2, 0),
        day = (D.getDate() + '').padStart(2, 0),
        hours = (D.getHours() + '').padStart(2, 0),
        minute = (D.getMinutes() + '').padStart(2, 0),
        second = (D.getSeconds() + '').padStart(2, 0)
    oldDate = `${year}-${month}-${day} ${hours}:${minute}:${second}`
    return { oldDate, year, month, day, hours, minute, second }
}


/**
 * 数字格式化 基金或股票的数字 例：+23.33向上/-23.45向下
 * @param { string } ic 正负符号，基金涨跌符号
 * @param { Number } n 数据値
 * @param { Number } dig 小数点个数
 * @param { String } b 是否是部分値
 */
const numberFiexd = (ic, n, dig, b) => {
    let msg = "", d = 0
    if (!isEmpty(n)) {
        msg = Number(n).toFixed(dig)
        if (n > 0) {
            msg = ic + msg + b
        } else {
            msg = msg + b
        }
    } else {
        msg = d.toFixed(dig)
    }
    return msg
}

/*
* 参数说明：(一般用于金钱格式化) 例：234,312,389.23
* s：要格式化的数字
* n：保留几位小数
*/
const fmoney = (s, n) => {
    if (s == '') return parseFloat(0).toFixed(n)
    n = n > 0 && n <= 20 ? n : 2;
    s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + "";
    let l = s.split(".")[0].split("").reverse(), r = s.split(".")[1];
    let t = "";
    for (let i = 0; i < l.length; i++) {
        t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? "," : "");
    }
    return t.split("").reverse().join("") + "." + r;
}

/**
 * 金钱表现形式 例：24万元、6千万元
  * @param { number } money 需要转换的金额 
  * @param { number } digit 需要保留多少位数
  * 
  */
const simplifyMoney = (money = 0, digit = 1) => {
    const numStr = money.toString();
    const numSplit = numStr.split(".")[0];
    const roundNum = parseInt(money);
    const m = Math.pow(10, digit);
    if (numSplit.length <= 4) {
        return `${numStr}(元)`;
    } else if (numSplit.length > 4 && numSplit.length <= 7) {
        const average = roundNum / 10000;
        const round = parseInt(average * m) / m;
        return `${round}万(元)`;
    } else if (numSplit.length == 8) {
        const average = roundNum / 10000000;
        const round = parseInt(average * m) / m;
        return `${round}千万(元)`;
    } else {
        const average = roundNum / 100000000;
        const round = parseInt(average * m) / m;
        return `${round}亿(元)`
    }
}

/**

   * 脱敏手机号
   * @param {String} mobile 手机号
   * @param {String} type 定位参数   encrypt 加密， fmt 格式化
   */

const fmtMobilePhoneNumber= (mobile, type) => {
    if(type=="encrypt"){
        return mobile.slice(0, 3) + '****' + mobile.slice(-4)
    }else if(type=="fmt"){
        mobile = mobile.replace(/^(.{3})(.*)(.{4})/, '$1 $2 $3');

        return '+86 ' + mobile
    }else{
        return mobile
    }

    

  }



//   表单验证
// 表单验证
var regs = {
    // 禁止输入汉子
    ChineseReg: /[\u4e00-\u9fa5]/ig,
    // 只能输入中文、英文、原点，且2至20个字符内
    nameReg: /^[\u4E00-\u9FA5A-Za-z·]{2,20}$/,
    // 只能输入0以上的正整数
    numberReg: /^[0-9]*[1-9][0-9]*$/,

    // 11为手机号以1开头，3-9为第二个数，后跟9位数
    phoneReg: /^((1[3-9]))\d{9}$/,
    // 11位数的座机号校验，前三或四位数，后七或八位数，中间以-隔开
    telReg: /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/,
    // 限制由大小写字母，数字，_ - at 组成
    emailReg: /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/,
    // 限制18位的身份证号校验，前六位地区，非0打头，出身年份，月份，01-12月，日期，01-31天，顺序码三位 + 一位校验码
    IDCartReg: /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)/,
    // 至少包含 数字和英文，长度6-20
    passwordReg: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/,
    // 至少包含数字跟字母，可以有字符
    password1Reg: /(?=.*([a-zA-Z].*))(?=.*[0-9].*)[a-zA-Z0-9-*/+.~!@#$%^&*()]{6,20}$/,
    // 6-20位字符,可包含数字，字母(区分大小写)
    password2Reg: /^[A-Za-z0-9@_.-]{6,20}$/,

    // 匹配后缀名（例子是.jpg或.bmp后缀，根据需求可做修改）
    suffixReg: /(.*)(\.jpg|\.bmp)$/,
    // 必须以http、ftp、https://开头的
    urlHeadReg: /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/
}
// 表单验证
const regexVerify = (reg, val) => {
    let FlagReg = regs[reg + 'Reg']
    return FlagReg.test(val);
}

//   禁止输入  未测试
const keyInputVal = (reg, val) => {
    let FlagReg = regs[reg + 'Reg']
    let value = val.replace(FlagReg, ''); // 正则表达式替换非数字和字母字符为空
    return value
}

// 不推荐：vue3+vite使用图片偶尔会报错使用这个方法解决  
const imgPage = (imgName) => {
    const path = `../assets/swiper/${imgName}`;
    const modules = import.meta.globEager("../assets/swiper/*");
    return modules[path].default
}
// 推荐：vue3图片引入方式，使用时可以把路径作为变量使用
const getAssetsFile = (url) => {
    return new URL(`../assets/images/${url}`, import.meta.url).href
}


/**
 * 根据属性进行排序
 * 
 * @param { Array } data 元数据
 * @param { String } prop 排序的属性
 * @param { Boolean } sorter 根据真假进行排序  Ascending 升序 descending 降序
 * 
 * **/
const compare = (data, prop, sorter) => {//property:根据什么属性排序
    let sortData = data.sort((a, b) => {
        var value1 = a[prop];
        var value2 = b[prop];
        // number 排序
        // console.log( (Number(value1)))
        console.log(typeof value1)
        if (typeof value1 === "number") {
            return sorter ? value1 - value2 : value2 - value1
        } else {
            if ((classifyChar(value1) === "E" || classifyChar(value1) === "C") && sorter) {
                return value1.localeCompare(value2)
            }
            if ((classifyChar(value1) === "E" || classifyChar(value1) === "C") && !sorter) {
                return value2.localeCompare(value1)
            }
        }
    })
    
}
// 区分传入的值是字中文、英文还是数值
// ch 参数是中文还是英文
const classifyChar = (ch) => {
    var patternChinese = new RegExp("[\u4E00-\u9FA5]+");   //汉字
    var patternEnglish = new RegExp("[A-Za-z]+");         // 英文
    var patternNumber = new RegExp("[0-9]+");            //数字
    //英文
    if (patternEnglish.test(ch)) return "E";
    // 中文
    if (patternChinese.test(ch))  return "C"
    // 数字
    if (patternNumber.test(ch)) return "N"; 
    // 其他
    return "O"; 
}

//例子 const array = [{id:10,name:'张三',sage:"abc"},{id:5,name:'李四',sage:"bcd"},{id:12,name:'王五',sage:'zde'},{id:20,name:'赵六',sage:'csdf'}];




/**
 * @param { string/array/object } data 元数据；
 * @param { string } calc 操作指令
 * @param { Array/string } par 可选参数 ，位置，截取
 * slice: 截取拼接
 * parseInt:舍弃小数取整数
 * 
 * 截取、删除、 拼接、 转换、  
 * // string:  slice  (0, 10)   (0,str.length-1)
 * ['slice','parseInt', 'stringify/parse']
 *
 */
const calcData = (data, par, calc) => {

}
// 数组
const typeArray = () => {

}
// 字符串
const typeString = () => {

}
const typeObject = () => {

}
/**
 * 快速获取url参数,ie不兼容，其他浏览器兼容
 * @param {String} url url地址
 * @return {Object} 返回参数对象
 * 
*/
const paramsUrl = () => {
    let query = window.location.search
    return Object.fromEntries(new URLSearchParams(query));
}
export {
    filterFun,
    formatDate,
    isEmpty,
    iosFormatDate,
    numberFiexd,
    fmoney,
    simplifyMoney,
    regexVerify,
    getAssetsFile,
    compare,
    classifyChar,
    calcData,
    fmtMobilePhoneNumber,
    paramsUrl
}